<?php

class TestController extends Zend_Controller_Action
{
    private static $semestres = array( "0" => "Materias de Formaci&oacute;n Cultural",
                        "1" => "Primer Semestre",
                        "2" => "Segundo Semestre",
                        "3" => "Tercer Semestre",
                        "4" => "Cuarto Semestre",
                        "5" => "Quinto Semestre",
                        "6" => "Sexto Semestre",
                        "7" => "S&eacute;ptimo Semestre",
                        "8" => "Octavo Semestre",
                        "9" => "Noveno Semestre",
                        "10" => "D&eacute;cimo Semestre",
                        "11" => "Onceavo Semestre",
                        "12" => "Doceavo Semestre"),
                $dias = array("1" => "Lunes",
                        "2" => "Martes",
                        "3" => "Mi&eacute;rcoles",
                        "4" => "Jueves",
                        "5" => "Viernes",
                        "6" => "S&aacute;bado");
    private $tablaSinCerrar;

    public function init(){
        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    private function esNuevoCurso($cursoNuevo, $cursoActual){
        if($cursoNuevo['carrera'] != $cursoActual['carrera'] ||         // carrera distinta
            $cursoNuevo['semestre'] != $cursoActual['semestre'] ||      // semestre distinto
            $cursoNuevo['seccion'] != $cursoActual['seccion'] ||        // seccion distinta
            $cursoNuevo['dia'] != $cursoActual['dia'] ||                // seccion distinta
            $cursoNuevo['materia'] != $cursoActual['materia'] ||        // materia distinta
            $cursoNuevo['horaInicio'] != $cursoActual['horaInicio'] ||  // inicio de clase (hora) distinta
            $cursoNuevo['horaFin'] != $cursoActual['horaFin'] ||        // fin de clase (hora) distinta
            $cursoNuevo['aula'] != $cursoActual['aula'])                // aula distinta
        {
            return true;
        }

        return false;
    }

    private function agruparCursos($cursos){
        $cursosAgrupados = array();
        $cursoActual = -1;
        $profesoresCurso = 0;

        foreach($cursos as $curso){
            // un nuevo curso se agrega a la lista
            if($cursoActual < 0 || ($cursoActual >= 0 && $this::esNuevoCurso($curso, $cursosAgrupados[$cursoActual]))){
                $cursoActual++;
                $cursosAgrupados[$cursoActual]['carrera'] = $curso['carrera'];
                $cursosAgrupados[$cursoActual]['semestre'] = $curso['semestre'];
                $cursosAgrupados[$cursoActual]['seccion'] = $curso['seccion'];
                $cursosAgrupados[$cursoActual]['dia'] = $curso['dia'];
                $cursosAgrupados[$cursoActual]['materia'] = $curso['materia'];
                $cursosAgrupados[$cursoActual]['horaInicio'] = $curso['horaInicio'];
                $cursosAgrupados[$cursoActual]['horaFin'] = $curso['horaFin'];
                $cursosAgrupados[$cursoActual]['aula'] = $curso['aula'];

                $profesoresCurso = 0;
                $cursosAgrupados[$cursoActual]['profesores'] = array();
                $cursosAgrupados[$cursoActual]['profesores'][$profesoresCurso] = $curso['profesor'];
                $cursosAgrupados[$cursoActual]['categorias'] = array();
                $cursosAgrupados[$cursoActual]['categorias'][$profesoresCurso] = $curso['categoria'];
            }

            // se agrupan los profesores
            else{
                $profesoresCurso++;
                $cursosAgrupados[$cursoActual]['profesores'][$profesoresCurso] = $curso['profesor'];
                $cursosAgrupados[$cursoActual]['categorias'][$profesoresCurso] = $curso['categoria'];
            }
        }

        return $cursosAgrupados;
    }

    private function dibujarCabeceraHorario(){
        echo "<table bgcolor='#ccc'>
            <tr>
                <th>HORAS</th>
                <th>LUNES</th>
                <th>MARTES</th>
                <th>MI&Eacute;RCOLES</th>
                <th>JUEVES</th>
                <th>VIERNES</th>
                <th>S&Aacute;BADO</th>
            </tr>";
        $this->tablaSinCerrar = true;
    }
    private function dibujarPieHorario(){
        $this->tablaSinCerrar = false;
        echo "</table>";
    }

    private static function dibujarCursoDiaHora($tablaHorario, $curso, $horaActual){
        for($i=1;$i<$curso['dia'];$i++){
           // if(!isset($tablaHorario[]))
        }

        echo "<b> Horario: </b>".$curso['horaInicio']." - ".$curso['horaFin']."<br/>";
        echo "<b>Materia: </b>".utf8_decode($curso['materia'])."<br/>";
        echo "<b>Profesores: </b><br/>";
        for($i=0; $i < count($curso['profesores']); $i++){
            echo utf8_decode($curso['profesores'][$i])." (".$curso['categorias'][$i].")"."<br/>";
        }
        echo "<br/>";

    }


    private function imprimirHorarios($cursos){
        echo "<div style='font-size: 12;font-family: Verdana;'>";
        $this->tablaSinCerrar = false;
        $carreraActual = "";
        $semestreActual = -1;
        $seccionActual = "";
        $tablaHorario = array();
        $horaActual = 0;
        $diaActual = 0;
        $float = "left";

        foreach ($cursos as &$curso) {
            // nueva carrera
            $carrera = utf8_decode($curso['carrera']);
            if(!$carreraActual || $carreraActual != $carrera){
                // fin horario anterior
                if($this->tablaSinCerrar)
                    $this::dibujarPieHorario();
                if($diaActual){
                    echo "</div>";
                    echo "<div style='clear: both;'></div>";
                }
                echo "<h1 style='color:#999;'>".$carrera."</h1>";
                $carreraActual = $carrera;
                $semestreActual = -1;
                $seccionActual = "";
                $tablaHorario = array();

                $diaActual = 0;
                $float = "left";

            }

            // cada semestre/sección
            if($semestreActual < 0 || $semestreActual != $curso['semestre'] || // nuevo semestre
                !$seccionActual || $seccionActual != $curso['seccion'])     // nueva sección en el semestre
            {
                // fin horario anterior
               // if($this->tablaSinCerrar)
                //    $this::dibujarPieHorario();
                if($diaActual){
                    echo "</div>";
                     echo "<div style='clear: both;'></div>";
                }
                echo "<h2 style='color:#8D9BCD;text-align:center;'>".TestController::$semestres[$curso['semestre']]." - Secci&oacute;n ".$curso['seccion']."</h2>";
                $semestreActual = $curso['semestre'];
                $seccionActual = $curso['seccion'];

                $diaActual = 0;
                $float = "left";


                // nuevo horario
             //   $this::dibujarCabeceraHorario();

                // filas: horas cátedra del semestre/sección, columnas: días de la semana. Indica qué celdas están ocupadas.
                // una columna con valor -1 indica que ya se revisó la columna y no hay un curso allí.
                $tablaHorario = array();
                $horaActual = 0;
                $tablaHorario[$horaActual][0]["horaInicio"] = $curso['horaInicio'];
                $tablaHorario[$horaActual][0]["horaFin"] = date("H:i", strtotime("+45 minutes", strtotime($curso['horaInicio'])));
            }

            // nueva fila de la tabla
            if(!$horaActual || $curso['horaInicio'] >= $tablaHorario[$horaActual][0]["horaFin"]){
                $tablaHorario[$horaActual][0]["horaInicio"] = $curso['horaInicio'];
                $tablaHorario[$horaActual][0]["horaFin"] = date("H:i", strtotime("+45 minutes", strtotime($curso['horaInicio'])));

               // for($i = 1)
            }

            if(!$diaActual || $diaActual != $curso['dia']){
                if($diaActual){
                    echo "</div>";
                    if($float == "left")
                        echo "<div style='clear: both;'></div>";
                }
                echo "<div style='float: ".$float.";width:50%'><h3 style='color:#6BA5E7;'>".TestController::$dias[$curso['dia']]."</h3>";
                $diaActual = $curso['dia'];
                $float = $float == 'left' ? 'right' : "left";
            }
            // el curso actual será dibujado en la tabla de horario para el semestre/sección
            $this::dibujarCursoDiaHora($tablaHorario,$curso, $horaActual);
        }

        // fin horario anterior
        //if($this->tablaSinCerrar)
          //  $this::dibujarPieHorario();
        echo "</div>";
    }

    public function indexAction(){

        $cursos = $this->em->createQueryBuilder()
            ->select('c.semestre as semestre')
            ->addselect('c.seccion as seccion')
            ->addselect('c.tipo as tipo')
            ->addselect('ca.nombre as carrera')
            ->addselect('m.nombre as materia')
            ->addselect('a.nombre as aula')
            ->addselect('de.dia as dia')
            ->addselect('de.horaInicio')
            ->addselect('de.horaFin')
            ->addselect('de.horaFin')
            ->addselect('de.duracionHoras')
            ->addselect('u.nombre as nombreProf')
            ->addselect('u.apellido as apellidoProf')
            ->addselect('ct.nombre as categoria')
            ->from('Default_Model_Curso', 'c')
            ->join('c.carreraMateria', 'cm')
            ->join('c.detalles', 'de')
            ->leftjoin('de.aula', 'a')
            ->join('cm.carrera', 'ca')
            ->join('cm.materia', 'm')
            ->join('c.responsables', 're')
            ->join('re.categoria', 'ct')
            ->join('re.profesor', 'p')
            ->join('p.usuario', 'u')
            ->where("c.anho='2013'")
            ->andWhere("c.semestreAnho='2'")
           // ->andWhere("ca.idCarrera='2'")
            ->orderBy('ca.idCarrera, c.semestre, c.seccion, de.dia, de.horaInicio')
            ->getQuery()
            ->execute();

        foreach ($cursos as &$curso) {
            $curso['horaInicio'] = $curso['horaInicio']->format('H:i');
            $curso['horaFin'] = $curso['horaFin']->format('H:i');
            if(!is_null($curso['tipo']) && $curso['tipo'] == 'T')
                $curso['materia'] = "Tutoría de ".$curso['materia'];
            $curso['profesor'] = $curso['apellidoProf'].", ".$curso['nombreProf'];
        }

        $cursos = $this::agruparCursos($cursos);

        $this::imprimirHorarios($cursos);
    }
}

